home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / 80x0393.zip / MODEX.ASM < prev    next >
Assembly Source File  |  1993-03-30  |  57KB  |  1,686 lines

  1. ;
  2. ; MODEX.ASM - A Complete Mode X Library 
  3. ; By Matt Pritchard 
  4. ; With considerable input from Michael Abrash 
  5. ; The following information is donated to the public domain in 
  6. ; the hopes that save other programmers much frustration. 
  7. ; If you do use this code in a product, it would be nice if 
  8. ; you include a line like 'Mode X routine by Matt Pritchard' 
  9. ; in the credits. '
  10. ;
  11.  
  12.     .MODEL Medium, Basic
  13.     .286
  14.     PAGE    255, 132
  15.  
  16.     ; ==== MACROS ====
  17.  
  18. OUT_16 MACRO Register, Value
  19.     MOV     DX, Register        ; Select Register
  20.     MOV     AX, Value           ; Get Out Value
  21.     OUT     DX, AX              ; Set Register(s) 
  22.     ENDM
  23.  
  24. OUT_8 MACRO Register, Value
  25.     MOV     DX, Register        ; Select Register
  26.     MOV     AL, Value           ; Get Out Value
  27.     OUT     DX, AL              ; Set Register 
  28.     ENDM
  29.  
  30.     ; ==== General Constants ====
  31.  
  32.     False   EQU 0
  33.     True    EQU -1
  34.  
  35.     b       EQU BYTE PTR
  36.     w       EQU WORD PTR
  37.     d       EQU DWORD PTR
  38.  
  39.     ; ==== VGA Register Values ====
  40.  
  41.     VGA_Segment     EQU 0A000H  ; Vga Memory Segment
  42.  
  43.     ATTRIB_Ctrl     EQU 03C0H   ; VGA Attribute Controller
  44.     GC_Index        EQU 03CEH   ; VGA Graphics Controller
  45.     SC_Index        EQU 03C4H   ; VGA Sequencer Controller
  46.     SC_Data         EQU 03C5H   ; VGA Sequencer Data Port
  47.     CRTC_Index      EQU 03D4H   ; VGA CRT Controller
  48.     CRTC_Data       EQU 03D5H   ; VGA CRT Controller Data
  49.     MISC_OUTPUT     EQU 03C2H   ; VGA Misc Register
  50.     INPUT_1         EQU 03DAH   ; Input Status #1 Register
  51.  
  52.     DAC_WRITE_ADDR  EQU 03C8H   ; VGA DAC Write Addr Register
  53.     DAC_READ_ADDR   EQU 03C7H   ; VGA DAC Read Addr Register
  54.     PEL_DATA_REG    EQU 03C9H   ; VGA DAC/PEL data Register R/W
  55.  
  56.     MAP_MASK        EQU 02      ; Map Register #
  57.     READ_MAP        EQU 04      ; Read Map Register #
  58.     MAP_MASK_PLANE1 EQU 0102h   ; Map Register + Plane 1
  59.  
  60.     START_DISP_HI   EQU 0Ch     ; CRTC Index: Display Start Addr Hi
  61.     START_DISP_LO   EQU 0Dh     ; CRTC Index: Display Start Addr Lo
  62.  
  63.     PLANE_BITS      EQU 03h     ; Bits 0-1 of Xpos = Plane #
  64.     ALL_PLANES      EQU 0Fh     ; All Bit Planes Selected
  65.     ALL_PLANES_ON   EQU 0F02h   ; Map Register + All Bit Planes
  66.     CHAIN4_OFF      EQU 0604h   ; Chain 4 mode Off
  67.     ASYNC_RESET     EQU 0100h   ; (A)synchronous Reset
  68.     SEQU_RESTART    EQU 0300h   ; Sequencer Restart
  69.  
  70.     ; Constants Specific for these routines
  71.  
  72.     NUM_MODES       EQU 8       ; # of Mode X Variations
  73.  
  74.     ; Specific Mode Data Table format...
  75.  
  76.     M_MiscR         EQU 0       ; Value of MISC_OUTPUT register
  77.     M_Pages         EQU 1       ; Maximum Possible # of pages
  78.     M_XSize         EQU 2       ; X Size Displayed on screen
  79.     M_YSize         EQU 4       ; Y Size Displayed on screen
  80.     M_XMax          EQU 6       ; Maximum Possible X Size
  81.     M_YMax          EQU 8       ; Maximum Possible Y Size
  82.     M_CRTC          EQU 10      ; Table of CRTC register values
  83.  
  84.     ; ==== DGROUP STORAGE NEEDED (36 BYTES) =====
  85.  
  86.     .DATA?
  87.  
  88. SCREEN_WIDTH    DW  0           ; Width of a line in Bytes 
  89. SCREEN_WIDTHx4  DW  0           ; Width of a line in Pixels 
  90. SCREEN_HEIGHT   DW  0           ; Veritcal Height in Pixels
  91.  
  92. LAST_PAGE       DW  0           ; # of Display Pages 
  93. PAGE_ADDR       DW  0, 0, 0, 0  ; Offsets to start of each page
  94.  
  95. PAGE_SIZE       DW  0           ; Size of Page in Addr Bytes
  96.  
  97. DISPLAY_PAGE    DW  0           ; Page # currently displayed 
  98. ACTIVE_PAGE     DW  0           ; Page # currently active
  99.  
  100. CURRENT_PAGE    DW  0           ; Offset of current Page 
  101. CURRENT_SEGMENT DW  0           ; Segment of VGA memory
  102.  
  103. CURRENT_XOFFSET DW  0           ; Current Display X Offset 
  104. CURRENT_YOFFSET DW  0           ; Current Display Y Offset
  105.  
  106. CURRENT_MOFFSET DW  0           ; Current Start Offset
  107.  
  108. MAX_XOFFSET     DW  0           ; Current Display X Offset 
  109. MAX_YOFFSET     DW  0           ; Current Display Y Offset
  110.  
  111.     .CODE
  112.  
  113.     ; Data Tables, Put in Code Segement for Easy Access
  114.     ; (Like when all the other Segment Registers are in
  115.     ; use!!) and reduced DGROUP requirements...
  116.  
  117. LEFT_CLIP_MASK      DB  0FH, 0EH, 0CH, 08H
  118.  
  119. RIGHT_CLIP_MASK     DB  01H, 03H, 07H, 0FH
  120.  
  121. MODE_TABLE:
  122.         DW  OFFSET MODE_320x200, OFFSET MODE_320x400
  123.         DW  OFFSET MODE_360x200, OFFSET MODE_360x400
  124.         DW  OFFSET MODE_320x240, OFFSET MODE_320x480
  125.         DW  OFFSET MODE_360x240, OFFSET MODE_360x480
  126.  
  127. MODE_320x200:           ; Data for 320 by 200 Pixels
  128.  
  129.         DB  063h        ; 400 scan Lines & 25 Mhz Clock
  130.         DB  4           ; Maximum of 4 Pages
  131.         DW  320, 200    ; Displayed Pixels (X,Y)
  132.         DW  1302, 816   ; Max Possible X and Y Sizes
  133.  
  134.         ;CRTC Setup Data....
  135.  
  136.         DW  00014H      ; Dword Mode off
  137.         DW  0E317H      ; turn on Byte Mode
  138.         DW  00000h      ; End of CRTC Data for 320x200
  139.  
  140. MODE_320x400:           ; Data for 320 by 400 Pixels
  141.  
  142.         DB  063h        ; 400 scan Lines & 25 Mhz Clock
  143.         DB  2           ; Maximum of 2 Pages
  144.         DW  320, 400    ; Displayed Pixels X,Y
  145.         DW  648, 816    ; Max Possible X and Y Sizes
  146.  
  147.         ;CRTC Setup Data....
  148.  
  149.         DW  04009H      ; Cell Heigth (1 Scan Line)
  150.         DW  00014H      ; Dword Mode off
  151.         DW  0E317H      ; turn on Byte Mode
  152.         DW  00000h      ; End of CRTC Data for 320x400
  153.  
  154. MODE_360x240:           ; Data for 360 by 240 Pixels
  155.  
  156.         DB  0E7h        ; 480 scan Lines & 28 Mhz Clock
  157.         DB  3           ; Maximum of 3 Pages
  158.         DW  360, 240    ; Displayed Pixels X,Y
  159.         DW  1092, 728   ; Max Possible X and Y Sizes
  160.  
  161.         ;CRTC Setup Data....
  162.  
  163.         DW  06B00H      ; Horz total
  164.         DW  05901H      ; Horz Displayed
  165.         DW  05A02H      ; Start Horz Blanking
  166.         DW  08E03H      ; End Horz Blanking
  167.         DW  05E04H      ; Start H Sync
  168.         DW  08A05H      ; End H Sync
  169.         DW  00D06H      ; Vertical Total
  170.         DW  03E07H      ; Overflow
  171.         DW  04109H      ; Cell Heigth (2 Scan Lines)
  172.         DW  0EA10H      ; V Sync Start
  173.         DW  0AC11H      ; V Sync End/Prot Cr0 Cr7
  174.         DW  0DF12H      ; Vertical Displayed
  175.         DW  00014H      ; Dword Mode off
  176.         DW  0E715H      ; V Blank Start
  177.         DW  00616H      ; V Blank End
  178.         DW  0E317H      ; turn on Byte Mode
  179.         DW  00000h      ; End of CRTC Data for 360x240
  180.  
  181. MODE_360x480:           ; Data for 360 by 480 Pixels
  182.  
  183.         DB  0E7h        ; 480 scan Lines & 28 Mhz Clock
  184.         DB  1           ; Only 1 Page Possible
  185.         DW  360, 480    ; Displayed Pixels X,Y
  186.         DW  544, 728    ; Max Possible X and Y Sizes
  187.  
  188.         ;CRTC Setup Data....
  189.  
  190.         DW  06B00H      ; Horz total
  191.         DW  05901H      ; Horz Displayed
  192.         DW  05A02H      ; Start Horz Blanking
  193.         DW  08E03H      ; End Horz Blanking
  194.         DW  05E04H      ; Start H Sync
  195.         DW  08A05H      ; End H Sync
  196.         DW  00D06H      ; Vertical Total
  197.         DW  03E07H      ; Overflow
  198.         DW  04009H      ; Cell Heigth (1 Scan Line)
  199.         DW  0EA10H      ; V Sync Start
  200.         DW  0AC11H      ; V Sync End/Prot Cr0 Cr7
  201.         DW  0DF12H      ; Vertical Displayed
  202.         DW  00014H      ; Dword Mode off
  203.         DW  0E715H      ; V Blank Start
  204.         DW  00616H      ; V Blank End
  205.         DW  0E317H      ; turn on Byte Mode
  206.  
  207.         DW  00000h      ; End of CRTC Data for 360x480
  208.  
  209. MODE_320x240:           ; Data for 320 by 240 Pixels
  210.  
  211.         DB  0E3h        ; 480 scan Lines & 25 Mhz Clock
  212.         DB  3           ; Maximum of 3 Pages
  213.         DW  320, 240    ; Displayed Pixels X,Y
  214.         DW  1088, 818   ; Max Possible X and Y Sizes
  215.  
  216.         DW  00D06H      ; Vertical Total
  217.         DW  03E07H      ; Overflow
  218.         DW  04109H      ; Cell Heigth (2 Scan Lines)
  219.         DW  0EA10H      ; V Sync Start
  220.         DW  0AC11H      ; V Sync End/Prot Cr0 Cr7
  221.         DW  0DF12H      ; Vertical Displayed
  222.         DW  00014H      ; Dword Mode off
  223.         DW  0E715H      ; V Blank Start
  224.         DW  00616H      ; V Blank End
  225.         D